﻿#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef char DataType;

// 定义二叉树节点类型
typedef struct TreeNode
{
	DataType val;
	struct TreeNode* left;
	struct TreeNode* right;
}TreeNode;

// 基础操作函数
// 创建节点
TreeNode* CreateNode(DataType val);
// 二叉树 - 直接构造
TreeNode* CreateDisplayBinaryTree();
// 二叉树 - 通过前序遍历序列构造 eg：ABD##E#H##CF##G##
TreeNode* CreateBinaryTreeByPreOrderString(DataType* str, int* i);
// 二叉树 - 销毁
void DestoryBinaryTree(TreeNode* root);
// 二叉树 - 节点个数
int BinaryTreeSize(TreeNode* root);
// 二叉树 - 叶子节点个数
int BinaryTreeLeafSize(TreeNode* root);
// 二叉树 - 第k层节点个数
int BinaryTreeKLevelSize(TreeNode* root, int k);
// 二叉树 - 查找值为val的节点
TreeNode* BinaryTreeFind(TreeNode* root, DataType val);
// 二叉树 - 判断是否为完全二叉树 是为1 不是为0
int BinaryTreeComplete(TreeNode* root);

// 遍历操作函数 - 递归方式
// 前序遍历
void PreOrderByRecursion(TreeNode* root);
// 中序遍历
void MidOrderByRecursion(TreeNode* root);
// 后序遍历
void PostOrderByRecursion(TreeNode* root);

// 遍历操作函数 - 层序
void LevelOrder(TreeNode* root);

